15-4 ]wp瘞?

Response.Cookies可以用來設定用戶端的小餅乾。對於任一個小餅乾 Name 而言,Response.Cookies(Name) 有下列性質:
Response.Cookies(Name) 的性質列表
性質說明
Expires指定 Cookies 資料的有效期限
Domain讓 Cookies 存在於特定的 Domain 下
Path讓 Cookies 存在於特定的路徑下
Secure 值域為 True 或 False,代表 Cookies 資料是否以 SSL (Secure Socket Layer) 的方式傳送

下面是一個使用 Cookies 的基本範例:

Example(response/cookie01.asp):

在上述範例中,只要填過大名,網頁就會顯示上次來訪時間,上述範例的完整原始檔案如下:

原始檔(response/cookie01.asp):(灰色區域按兩下即可拷貝)
<%@Language=JScript%>
<%
now = new Date();
expDate = new Date();
expDate.setTime(now.getTime()+365*24*60*60*1000);	// 資料將被保留一年	
x = Request.Form("userName")+"";
if (x!="undefined"){		// 由表單點選來載入此頁 ==> 設定小餅乾
	Response.Cookies("userName") = Request("userName");
	Response.Cookies("userName").Expires = expDate.getVarDate();	// 必須使用 getVarDate() 將資料型態轉成 VARIANT
	Response.Cookies("userTime") = now.toLocaleString();
	Response.Cookies("userTime").Expires = expDate.getVarDate();	// 必須使用 getVarDate() 將資料型態轉成 VARIANT
}
%>
<% title = "使用 Cookie 的基本範例"; %>
<!--#include file="../head.inc"-->
<hr>

<%
userName = Request.Cookies("userName")+"";	// 取得小餅乾所記錄的 userName 資訊 
if (userName == ""){ %>
	您好像是第一次造訪本頁喔!請填入您的大名,謝謝!
<% } else { %>
	<%=userName%></font> 您好!
	<br>您上次登錄時間為 <%=Request.Cookies("userTime")%>。
	<br>如果您的大名不是 <%=userName%>,請重新登錄。
<% } %>

<form method=post>
大名:<input name="userName"> <input type=submit>
</form>
(您填入的資訊將會被保留在您的硬碟中的 Cookies,保留期限一年。)

<hr>
<!--#include file="../foot.inc"-->

如上一節所述,由於 Request.Cookies 是一個 Dictionary 變數,所以我們可以對其內容進行一一列表,例如:

Example(response/listCookie01.asp):

上述範例的完整原始檔案如下:

原始檔(response/listCookie01.asp):(灰色區域按兩下即可拷貝)
<%@Language=JScript%>
<%
Response.Cookies("111") = "台北";
Response.Cookies("222") = "高雄";
%>
<% title = "以 JScript 印出 Request.Cookies 的內容" %>
<!--#include file="../head.inc"-->
<hr>

<!--#include file="../listdict.inc"-->
<% listdict(Request.Cookies, "Request.Cookies"); %>

<hr>
<!--#include file="../foot.inc"-->

在上述範例中,我們可以看出,一旦我們設定 Response.Cookies,對應的 Request.Cookies 也會立刻被改掉,這是比較特別之處。

對於 Request.Cookies 和 Response.Cookies 的 Name-Value Pairs,有幾點特別要注意:

  1. Request.Cookies 是不能修改的,你只能對 Response.Cookies 進行設定和修改。
  2. 未設定 Response.Cookie 前,Response.Cookies 和 Request.Cookies 具有相同的 Names。
  3. 一旦設定 Response.Cookies,新增或修改的 Name 和 Value 會立刻被拷貝至 Request.Cookies,同時 Response.Cookies 的 Value 也會被清空。
為驗證上述第二、三點,請見下列範例:

Example(response/listCookie02.asp):

上述範例的完整原始檔案如下:

原始檔(response/listCookie02.asp):(灰色區域按兩下即可拷貝)
<%@Language=JScript%>
<%Response.buffer=true%>
<% title = "Request.Cookies 和 Response.Cookies 的內容" %>
<!--#include file="../head.inc"-->
<hr>

<!--#include file="../listdict.inc"-->
未設定 Response.Cookie 之前:
<p><% listdict(Request.Cookies, "Request.Cookies"); %>
<p><% listdict(Response.Cookies, "Response.Cookies"); %>

<%
// 載入此網頁後,每次都設定新的小餅乾
today = new Date();
todayStr = today.toLocaleString();
Response.Cookies(todayStr) = todayStr;
%>

設定 Response.Cookie 之後:
<p><% listdict(Request.Cookies, "Request.Cookies"); %>
<p><% listdict(Response.Cookies, "Response.Cookies"); %>

<hr>
<!--#include file="../foot.inc"-->

基本上,Cookies 是經由 HTTP Header 來傳送。當用戶端向伺服器要求網頁時,事實上這個送到伺服器的 Request 就包含著和此網頁相關的 Cookies,因此伺服器可以根據這些資訊,來建立出 Request.Cookies 的物件。當伺服器要送網頁給用戶端時,在傳送網頁內容之前,會先傳送相關的表頭(Header)或標題資訊,以 Response.Cookies 所設定的 Cookies 內容,就是被放在表頭(標題)資訊內,一起被送到用戶端。如果 Response.Buffer 被設定為 false,而且你的 ASP 網頁先送出內容,然後再使用 Response.Cookies 來設定 Cookies,就會得到含有錯誤訊息的網頁,範例如下:

Example(response/cookie02.asp):

在上述範例中,由於 Response.Cookies 的設定是出現在網頁內容之後,但由於 Response.Buffer 被設定成 False,所以一旦伺服器開始送出網頁資訊,就不可能再傳送 Cookie 等表頭資訊,所以才會產生上述的錯誤訊息。上述範例的完整原始檔案如下:

原始檔(response/cookie02.asp):(灰色區域按兩下即可拷貝)
<%@Language=JScript%>
<% Response.buffer = false %>
<% title = "產生錯誤的 Cookie 使用範例" %>
<!--#include file="../head.inc"-->
<hr>

<p>這是網頁內容。
<p><!--#include file="../foot.inc"-->
<p>以下嘗試修改表頭資訊,將造成錯誤...
<% Response.Cookies("xyz") = "abc"; %>

<hr>
<!--#include file="../foot.inc"-->

Hint
Response.Buffer 的預設值通常是 true,但是你也可以直接從伺服器的設定改成 false。因此為了保險起見,我們最好不要依賴預設值,而應該直接在 ASP 程式碼中設定我們所要的值。

若要避免此錯誤的發生,基本上有兩種方法:

  1. 在送出任何網頁內容前,先執行 Response.Cookies 相關指令。請見此範例 example/response/cookie03.asp
  2. 設定 Response.Buffer 為 True,確保網頁內容先全部送到緩衝區後,伺服器再將表頭資訊及網頁內容一起送到用戶端。請見此範例 example/response/cookie04.asp。 (需注意的是,Response.Buffer=True 必須放在輸出任何 HTML 之前。)
Cookies 若沒有設定有效期限,則此 Cookies 只存在用戶端的記憶體,將隨著瀏覽器的關閉而消失。如果我們有設定 Cookies 的有效期限,則此 Cookies 將會被寫入用戶端的硬碟。此外,在設定有效期限之後,同一台電腦的多個瀏覽器(例如多個 IE)都會看到同一個 Cookies,但若沒設定有效期限,則 Cookies 只屬於特定的某一個瀏覽器。此外,各家瀏覽器對 Cookies 的支援方式亦不盡相同,故無法共用。
JScript 程式設計與應用:用於伺服器端的 ASP 環境